package gaobo.stack;

import java.util.Stack;

//实现一个最小栈【力扣155】
//题目:设计一个支出push，pop，top(peek) 操作，并能在常数时间内检索到最小元素的栈
/*逻辑
push
1.普通栈当中一定要放的,最小栈当中放不放？ 取决于当前元素X有没有最小栈的栈顶元素小
2.如果要存放的值为X，最小栈的栈顶元素时Y
   X<Y 放, X==Y 放且必须放, X>Y 不放
 */
public class MinStack {

    private Stack<Integer> stack1;
    private Stack<Integer> minStack;

    public MinStack(){
        stack1 = new Stack<>();
        minStack = new Stack<>();
    }

    public void push(int val){
        stack1.push(val);
        if (minStack.empty()){
            minStack.push(val);
        }else {
            int x = minStack.peek();
            if (val <= x){
                minStack.push(val);
            }
        }
    }

    public void pop(){
        if (!stack1.empty()){
            int x = stack1.pop();
            if(x == minStack.peek()){
                minStack.pop();
            }
        }
    }

    //只针对 普通栈来说的 获取普通栈的栈顶元素 相当于peek函数
    public int top(){
        if (!stack1.empty()){
            return stack1.peek();
        }
        return -1;//不要抛出异常
    }

    public int getMin(){
        if (minStack.empty()){
            return -1;
        }
        return minStack.peek();
    }
}
